home *** CD-ROM | disk | FTP | other *** search
/ Gekkan Dennou Club 145 / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan).7z / Gekkan Dennou Club - 2000.6 Vol. 145 (Japan) (Track 1).bin / tools / sharp / sxwork3.lzh / サンプル実用編 / 小遣い帳 / CSFILE.C < prev    next >
Text File  |  1994-03-10  |  11KB  |  363 lines

  1. /******************************************************************************
  2.  *    csfile.c:    ファイルのロード、セーブ処理関数
  3.  ******************************************************************************
  4.  *    Workroom SX-68K Sample Program Copyright 1994 SHARP
  5.  */
  6. #include <stdio.h>
  7. #include <string.h>
  8. #include <doslib.h>
  9. #include <dialog.h>        /* ダイアログマンを利用するときに必要    */
  10. #include <task.h>        /* タスクマンを利用するときに必要    */
  11. #include "cash.h"        /* このプログラム固有のヘッダファイル    */
  12. #include "csfile.h"        /* 小遣い帳データファイルのヘッダファイル */
  13.  
  14. /******************************************************************************
  15.  *    loadFile():    指定の日付のデータをファイルから読み込む
  16.  ******************************************************************************
  17.  *    引数:    ComVal *pcv    共通変数へのポインタ
  18.  *        int month    月
  19.  *        int day        日
  20.  *        int *tMoney    金額を格納するポインタ
  21.  *        char *tInfo    摘要を格納するポインタ
  22.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  23.  *                = FALSE: 読み込み失敗
  24.  */
  25. BOOLEAN loadFile(ComVal *pcv, int month, int day, int *tMoney, char *tInfo)
  26. {
  27.     int i, errCode, len;
  28.     short sp;
  29.     short index[512];        /* データの位置テーブル        */
  30.     FILE *hFile;            /* ファイルハンドル        */
  31.     KZDATA kzBuff;            /* ファイル1レコードバッファ    */
  32.  
  33.     /* ドライブを読み込みモードでチェック */
  34.     errCode = checkDrive(pcv->dataFile, 1);
  35.     if (errCode < 0) {
  36.         if (errCode == -4) {
  37.             /* ファイルが見付からない場合 */
  38.             DMError(D_CONFIRM, "データファイルが見付かりません。\r"
  39.                        "新規作成します。");
  40.             if(!newFile(pcv))
  41.                 return FALSE;
  42.  
  43.             clearData(pcv->money, pcv->info[0]);
  44.             return TRUE;
  45.  
  46.         } else
  47.             /* 読み込みが行えない場合 */
  48.             return FALSE;
  49.     }
  50.     /* ファイルをオープンする */
  51.     hFile = fopen(pcv->dataFile, "rb");
  52.     if (hFile == NULL) {
  53.         /* ファイルがオープンできない */
  54.         DMError(D_CONFIRM, "ファイルがオープンできません。");
  55.         clearData(tMoney, tInfo);
  56.         return FALSE;
  57.     }
  58.     fseek(hFile, 0, SEEK_SET);
  59.     len = fread(index, sizeof(short), 512, hFile);
  60.     if (len != 512) {
  61.         DMError(D_CONFIRM, "データファイルの構造が異常です。");
  62.         fclose(hFile);
  63.         return FALSE;
  64.     }
  65.     /* 指定の日付までのシーク位置を求める */
  66.     sp = index[(month - 1) * 32 + (day - 1)];
  67.     if (sp == -1) {
  68.         /* データ新規作成 */
  69.         clearData(tMoney, tInfo);
  70.         fclose(hFile);
  71.         return TRUE;
  72.     }
  73.     sp *= sizeof(KZDATA);
  74.     if (fseek(hFile, sp + 1024, SEEK_SET)) {
  75.         /* データ位置までシークできない */
  76.         DMError(D_CONFIRM, "データファイルの構造が異常です。");
  77.         fclose(hFile);
  78.         return FALSE;
  79.     }
  80.     /* データの読み込み */
  81.     len = fread((unsigned char *) &kzBuff, sizeof(KZDATA), 1, hFile);
  82.     if (len != 1) {
  83.         /* 読み込みエラーの場合 */
  84.         DMError(D_CONFIRM, "ファイルの読み込みに失敗しました。");
  85.         clearData(tMoney, tInfo);
  86.         fclose(hFile);
  87.         return FALSE;
  88.     }
  89.     /* バッファ内のデータをデュープする */
  90.     for (i = 0; i < 7; i++)
  91.         tMoney[i] = kzBuff.money[i];
  92.     memcpy(tInfo, kzBuff.info, 7 * 21);
  93.     /* ファイルをクローズする */
  94.     fclose(hFile);
  95.     return TRUE;
  96. }
  97.  
  98. /******************************************************************************
  99.  *    newFile():    新規ファイルを作成する
  100.  ******************************************************************************
  101.  *    引数:    ComVal *pcv    共通変数へのポインタ
  102.  *    戻り値:    BOOLEAN        = TRUE:  作成成功
  103.  *                = FALSE: 作成失敗
  104.  */
  105. BOOLEAN newFile(ComVal *pcv)
  106. {
  107.     int i, len;
  108.     short index[512];
  109.     FILE *hFile;
  110.  
  111.     /* データの位置テーブルを作成する */
  112.     for (i = 0; i < 16; i++)
  113.         index[i] = -1;
  114.     /* 一度にまとめてメモリを塗りつぶす */
  115.     for (i = 1; i < 32; i++)
  116.         memcpy(&index[i*16], &index[(i - 1) * 16], 32);
  117.     /* 新規ファイルとしてオープン */
  118.     hFile = fopen(pcv->dataFile, "ab+");
  119.     if (hFile == NULL) {
  120.         DMError(D_CONFIRM, "ファイルが作成できません。");
  121.         return FALSE;
  122.     }
  123.     /* テーブルをファイルに書き込む */
  124.     fseek(hFile, 0, SEEK_SET);    /* ファイルの先頭に移動 */
  125.     len = fwrite(index, sizeof(short), 512, hFile);
  126.     if (len != 512) {
  127.         DMError(D_CONFIRM, "ファイルの書き込みができません。");
  128.         fclose(hFile);
  129.         return FALSE;
  130.     }
  131.  
  132.     fclose(hFile);
  133.     return TRUE;
  134. }
  135.  
  136. /******************************************************************************
  137.  *    readTable():    データファイル内の位置テーブルを読み出す
  138.  ******************************************************************************
  139.  *    引数:    ComVal *pcv    共通変数へのポインタ
  140.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  141.  *                = FALSE: 読み込み失敗
  142.  *    注釈:
  143.  *    小遣い帳データの配置情報のテーブルをデータファイルより読み出します。
  144.  */
  145. BOOLEAN readTable(ComVal *pcv, short *index)
  146. {
  147.     int errCode, len;
  148.     FILE *hFile;
  149.  
  150.     /* ドライブを読み込みモードでチェック */
  151.     errCode = checkDrive(pcv->dataFile, 1);
  152.     if (errCode < 0) {
  153.         if (errCode == -4)
  154.             DMError(D_CONFIRM, "データファイルが存在しません。");
  155.         return FALSE;        /* 読み込みが行えない場合 */
  156.     }
  157.     /* ファイルをオープンする */
  158.     hFile = fopen(pcv->dataFile, "rb");
  159.     if (hFile == NULL) {
  160.         /* ファイルがオープンできない */
  161.         DMError(D_CONFIRM, "ファイルがオープンできません。");
  162.         return FALSE;
  163.     }
  164.     len = fread(index, sizeof(short), 512, hFile);
  165.     if (len != 512) {
  166.         DMError(D_CONFIRM, "データファイルの構造が異常です。");
  167.         fclose(hFile);
  168.         return FALSE;
  169.     }
  170.  
  171.     fclose(hFile);
  172.     return TRUE;
  173. }
  174.  
  175. /******************************************************************************
  176.  *    saveFile():    指定の日付のデータをファイルにセーブする
  177.  ******************************************************************************
  178.  *    引数:    ComVal *pcv    共通変数へのポインタ
  179.  *        int month    月
  180.  *        int day        日
  181.  *        int *tMoney    金額を格納するポインタ
  182.  *        char *tInfo    摘要を格納するポインタ
  183.  *    戻り値:    BOOLEAN        = TRUE:  読み込み成功
  184.  *                = FALSE: 読み込み失敗
  185.  */
  186. BOOLEAN saveFile(ComVal *pcv, int month, int day, int *tMoney, char *tInfo)
  187. {
  188.     int errCode, len;
  189.     short sp, index[512];
  190.     long flen;            /* ファイルのサイズ        */
  191.     FILE *hFile;            /* ファイルハンドル        */
  192.  
  193.     /* ドライブを書き込みモードでチェック */
  194.     errCode = checkDrive(pcv->dataFile, 0);
  195.     if (errCode < 0) {
  196.         if (errCode == -4)
  197.             /* ファイルが見付からないので新規にファイルを作成する */
  198.             /* データの位置テーブルを作成する */
  199.             return newFile(pcv);
  200.  
  201.         else
  202.             /* 書き込みが行えない場合 */
  203.             return FALSE;
  204.  
  205.     } else
  206.         /* 既存のファイルをオープン */
  207.         hFile = fopen(pcv->dataFile, "rb+");
  208.     if (hFile == NULL) {
  209.         errSaveFile(NULL, 1);    /* エラーメッセージを表示する */
  210.         return FALSE;
  211.     }
  212.     /* ファイルの位置を先頭に移動 */
  213.     fseek(hFile, 0, SEEK_SET);
  214.     /* データの位置テーブルを読み込む */
  215.     len = fread(index, sizeof(short), 512, hFile);
  216.     if (len != 512) {
  217.         /* 読み込みエラーの場合 */
  218.         errSaveFile(hFile, 2);    /* エラーメッセージを表示する */
  219.         return FALSE;
  220.     }
  221.     sp = index[(month - 1) * 32 + (day - 1)];
  222.     if (sp == -1) {
  223.         /* 新規のデータの場合 */
  224.         if (fseek(hFile, 0, SEEK_END)) {
  225.             /* データ位置までシークできない */
  226.             errSaveFile(hFile, 2);    /* エラーメッセージを表示する */
  227.             return FALSE;
  228.         }
  229.         /* 新規データの書き込み位置 */
  230.         flen = ftell(hFile);
  231.         if (flen < 0) {
  232.             /* データ位置までシークできない */
  233.             errSaveFile(hFile, 2);    /* エラーメッセージを表示する */
  234.             return FALSE;
  235.         }
  236.         sp = (flen - 1024) / sizeof(KZDATA);
  237.         /* テーブルをファイルに書き込む */
  238.         index[(month - 1) * 32 + (day - 1)] = sp;
  239.         fseek(hFile, 0, SEEK_SET);
  240.         len = fwrite(index, sizeof(short), 512, hFile);
  241.         if (len != 512) {
  242.             errSaveFile(hFile, 3);    /* エラーメッセージを表示する */
  243.             return FALSE;
  244.         }
  245.         fseek(hFile, 0, SEEK_END);
  246.     } else {
  247.         sp *= sizeof(KZDATA);
  248.         if (fseek(hFile, sp + 1024, SEEK_SET)) {
  249.             /* データ位置までシークできない */
  250.             errSaveFile(hFile, 2);    /* エラーメッセージを表示する */
  251.             return FALSE;
  252.         }
  253.     }
  254.     /* ファイルポインタにデータを書き込む */
  255.     /* 月 */
  256.     len = fwrite((unsigned char *) &month, sizeof(int), 1, hFile);
  257.     if (len != 1) {
  258.         errSaveFile(hFile, 3);    /* エラーメッセージを表示する */
  259.         return FALSE;
  260.     }
  261.     /* 日 */
  262.     len = fwrite((unsigned char *) &day, sizeof(int), 1, hFile);
  263.     if (len != 1) {
  264.         errSaveFile(hFile, 3);    /* エラーメッセージを表示する */
  265.         return FALSE;
  266.     }
  267.     /* 金額 */
  268.     len = fwrite((unsigned char *) tMoney, sizeof(int), 7, hFile);
  269.     if (len != 7) {
  270.         errSaveFile(hFile, 3);    /* エラーメッセージを表示する */
  271.         return FALSE;
  272.     }
  273.     /* 摘要 */
  274.     len = fwrite((unsigned char *) tInfo, sizeof(char), 7 * 21, hFile);
  275.     if (len != (7 * 21)) {
  276.         errSaveFile(hFile, 3);    /* エラーメッセージを表示する */
  277.         return FALSE;
  278.     }
  279.     /* データ量を偶数に補正 */
  280.     len = fwrite((unsigned char *) "", sizeof(char), 1, hFile);
  281.     if (len != 1) {
  282.         errSaveFile(hFile, 3);    /* エラーメッセージを表示する */
  283.         return FALSE;
  284.     }
  285.  
  286.     fclose(hFile);
  287.     return TRUE;
  288. }
  289.  
  290. /******************************************************************************
  291.  *    errSaveFile():    エラーメッセージを表示してファイルをクローズする
  292.  ******************************************************************************
  293.  *    引数:    FILE *hFile    クローズするファイルハンドル
  294.  *        int no        エラー番号
  295.  */
  296. void errSaveFile(FILE *hFile, int no)
  297. {
  298.     switch (no) {
  299.     case 1:
  300.         DMError(D_CONFIRM, "ファイルのオープンができません。");
  301.         break;
  302.     case 2:
  303.         DMError(D_CONFIRM, "データファイルの構造が異常です。");
  304.         break;
  305.     case 3:
  306.         DMError(D_CONFIRM, "ファイルの書き込みに失敗しました。");
  307.         break;
  308.     }
  309.     /* ファイルハンドルがNULLでなければファイルをクローズ */
  310.     if (hFile)
  311.         fclose(hFile);
  312. }
  313.  
  314. /******************************************************************************
  315.  *    checkDrive():    指定ファイル名のドライブをチェック
  316.  ******************************************************************************
  317.  *    引数:    char *fname    ファイル名へのポインタ
  318.  *        int mode    検査するモード
  319.  *                =  0: 書き込み
  320.  *                =  1: 読み込み
  321.  *    戻り値:    int        >= 0: 読み込み成功
  322.  *                = -1: ファイル名が正しくない
  323.  *                = -2: ドライブの準備ができていない
  324.  *                = -3: 書き込み禁止がされている
  325.  *                = -4: ファイルが存在しない
  326.  */
  327. int checkDrive(char *fname, int mode)
  328. {
  329.     int stat, errCode;
  330.     struct NAMECKBUF nminf;
  331.     char filbuf[TS_NAMEMAX];
  332.  
  333.     /* 入力されたファイル名を分解・検査 */
  334.     stat = NAMECK((unsigned char *) fname, &nminf);
  335.     if (stat != 0) {
  336.         DMError(D_CONFIRM, "ファイル名が正しくありません。");
  337.         return -1;
  338.     }
  339.     /* フルパス名を作成する */
  340.     strmfn(fname, (char *) nminf.drive, (char *) nminf.path, (char *) nminf.name, (char *) nminf.ext);
  341.  
  342.     /* 指定ファイル名のドライブの状態を取得する */
  343.     stat = TSDrvctrl(0, nminf.drive[0] & 0x1f);
  344.     /* ドライブが準備されているかをチェックする */
  345.     if ((stat & 0x06) != 0x02) {
  346.         DMError(D_CONFIRM, "ドライブの準備ができていません。");
  347.         return -2;
  348.     }
  349.     /* プロテクトされているかどうかをチェックする */
  350.     if (mode == 0 && (stat & 0x0a) == 0x0a) {
  351.         DMError(D_CONFIRM, "ライトプロテクトされています。\r"
  352.                    "書き込みを行うことができません。");
  353.         return -3;
  354.     }
  355.     /* ファイルの存在のチェック */
  356.     errCode = TSFiles(filbuf, fname, TS_ARCH);
  357.     if (errCode < 0)
  358.         /* ファイルの新規作成をする場合を考えて、エラーダイアログは出さない */
  359.         return -4;
  360.  
  361.     return 0;
  362. }
  363.